<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>


<script>

    /**
     * 创建对象的方式, 使用字面量创建, 但是你想下 ,  实例是有限制的。它们只创建单一对象。
     * 有时我们需要创建相同“类型”的许多对象的“蓝图”。
     * 创建一种“对象类型”的方法，是使用对象构造器函数。
     * */
    var userTmp = {
        name: "sky", age: 22
    };
    console.log(JSON.stringify(userTmp));

    /**
     * 这是 User 对象的构造器 函数;  也叫原型
     * */
    function User(name, age) {
        this.name = name;
        this.age = age;
    }
    /**
     * 使用原型 达到Java 中 static 函数的 功能 ;
     * 原型中声明了sayHello方法，当我们的构造实例对象去访问的时候访问的方法是同一个，
     * 这就是prototype原型最大的作用，共享属性和方法
     */
    User.prototype.sayHello = function () {
        console.log(this.name + ",  你好 !");

    };
    User.prototype.name = "我是原型的名字";
    let user = new User("sky", 22);
    user.sayHello();

    console.log("user.name ==> ", user.name);
    //使用in 检查 对象 or 对象原型中 是否有某个属性,
    console.log( "name in user => " ,    "name" in user);
    //hasOwnProperty 只检查对象
    console.log( "   user.hasOwnProperty(name)  = " ,     user.hasOwnProperty("name"));
    console.log( "   user.hasOwnProperty(hasOwnProperty)  = " ,     user.hasOwnProperty("hasOwnProperty"));

    User.school = "NCEPU" ;  // 这样没用, 不是这样加进去的
    user = new User("sky", 22  , "NCEPU");
    console.log(user);

    User.prototype.school="NCEPU";
    user  = new User("sky", 22 );
    console.log(user.school );  //这是动态添加的,  toStr方法 不会打印此属性;
    console.log("JSON.stringify(  user ) = " , JSON.stringify(  user ));
    console.log(user.constructor); //把user 对象的 构造函数 整个打印出来
    //创建对象include 函数, 一个叫做 __proto__ 的内置属性, 用于指向创建它的构造函数的原型对象
    //mark 请只修改您自己的原型。绝不要修改标准 JavaScript 对象的原型。
    console.log("user.__proto__ =" ,  user.__proto__); //原型对象
    console.log("User.prototype =" , User.prototype ); //类的原型属性
    console.log("User.__proto__ = " , User.__proto__);
    console.log("Function.prototype = " ,  Function.prototype );
    //hasOwnProperty 是哪来的, 你没有添加, 但是也能用, 就是来自原型的
    console.log(user.__proto__.hasOwnProperty("hasOwnProperty"));
    //user的原型对象也没有, 则去原型的原型中找, 直至找到object 的原型为止, 类似于Java object 就是顶层的对象
    /*  js native code  js本机代码 估计底层就是 */
</script>


</body>
</html>
